package lambdasinaction.chap8.my;

/**
 * 如果你需要采用某个算法的框架，同时又希望有一定的灵活度，能对它的某些部分进行改进，
 * 那么采用模板方法设计模式是比较通用的方案。
 * 好吧，这样讲听起来有些抽象。
 * 换句话说，模板方法模式在你“希望使用这个算法，但是需要对其中的某些进行改进，才能达到希望的效果“时是非常有用的。
 *
 * 让我们从一个例子着手，看看这个模式是如何工作的。假设你需要编写一个简单的在线银行应用。
 * 通常，用户需要输入一个用户账户，之后应用才能从银行的数据库中得到用户的详细信息，最终完成一些让用户满意的操作。
 * 不同分行的在线银行应用让客户满意的方式可能还略有不同，比如给客户的账户发放红利，
 * 或者仅仅是少发送一些推广文件。你可能通过下面的抽象类方式来实现在线银行应用：
 *
 * @author Fish
 * @since 0.0.1 2018/8/7 19:13
 */
abstract class MyOnlineBanking {

  /**
   * 搭建了在线银行算法的框架：获取客户提供的 ID，然后提供服务让用户满意。
   * 不同的支行可以通过继承 OnlineBanking 类，对该方法提供差异化的实现。
   * @param id
   */
  public void processCustomer(int id) {
    Customer c = Database.getCustemerWithId(id);
    makeCustomerHappy(c);
  }

  abstract void makeCustomerHappy(Customer c);

  // dummy Customer class
  static private class Customer {

  }

  // dummy Database class
  static private class Database {
    static Customer getCustemerWithId(int id) {
      return new Customer();
    }
  }
}
